<?php
/**
 * Задания, выполняемые в фоновом режиме.
 */
class Users_CronController extends Zend_Controller_Action {
	/**
	 * (non-PHPdoc)
	 * @see library/Zend/Controller/Zend_Controller_Action#init()
	 */
	public function init() {
		$this->_helper->viewRenderer->setNoRender(true);
	}

	/**
	 * Действие, вызывающее все остальные действия.
	 */
	public function indexAction() {
		$this->messageAction();
	}

	/**
	 * Выполнение рассылки писем с сообщениями.
	 */
	public function messageAction() {
		ob_start();

		foreach (array(1,2) as $iCode)
		{
			// Подготовка объекта SQL запроса.
			$oTable = new Users_Table_Message();
			$oSelect = $oTable->getAdapter()->select();
			$oSelect->from(array('t1' => $oTable->getTableName()));
			$oSelect->limit(10);

			switch ($iCode)
			{
				// Выбираем сообщения для конкретных пользователей.
				case 1:
					$oSelect->joinLeft(array('t2' => 't_message_flag'),'t1.target = t2.user_id and t1.id = t2.message_id');
					$oSelect->where('t1.target > ?',0);
					$oSelect->where(new Zend_Db_Expr('t2.flag IN (3,4)'));
					$oSelect->where(new Zend_Db_Expr('t2.message_id IS NULL'));
					break;

				// Выбираем сообщения широкого извещения.
				case 2:
					$oSelect->where('t1.target < ?',0);
					break;
			}

			echo "$oSelect\n\n";

			// Проходим по результатам запроса.
			foreach ($oSelect->query()->fetchAll() as $aRecord)
			{
				echo "Step ".(++$sdfhsjkd)."\n";
				
				switch ($iCode)
				{
					// Отсылаем сообщения для конкретных пользователей.
					case 1:
						$oUser = Users_Model_User::getById(intval($aRecord['target']));
						$this->_sendMessage($aRecord,$oUser,3,4);
						break;

					// Отсылка сообщения всем пользователям.
					case 2:
						$oSelect = $oTable->getAdapter()->select();
						$oSelect->from(array('t1' => 't_user'));
						$oSelect->limit(10);
						$oSelect->where(new Zend_Db_Expr('0 = ('.
							$oTable->getAdapter()->select()
								->from(array('t2' => 't_message_flag'),'COUNT(*)')
								->where(new Zend_Db_Expr('t2.user_id = t1.id'))
								->where('t2.message_id = ?',intval($aRecord['id']))
								->where('t2.flag = ?',5)
								->__toString()
							.')'));
						/*
						$oSelect->joinLeft(array('t2' => 't_message_flag'),'t1.id = t2.user_id','');
						$oSelect->where('t2.message_id = ?',$aRecord['id']);
						$oSelect->where('t2.flag = ?',5);
						$oSelect->where(new Zend_Db_Expr('t2.flag IS NULL'));
						*/

						echo "$oSelect\n\n";

						$bFlag = false;
						foreach ($oSelect->query()->fetchAll() as $aUserRecord)
						{
							$bFlag = true;
							$oUser = new Users_Model_User_Db($aUserRecord);
							$this->_sendMessage($aRecord,$oUser,5,5);
						}

						if (!$bFlag)
						{
							$oTable->update(array('target' => 0),'id = '.$aRecord['id']);
						}

						break;
				}
			}
		}


		$this->getResponse()->appendBody(ob_get_clean());
	}

	/**
	 * Отсылка письма о получении внутреннего сообщения.
	 * 
	 * @param array $aRecord  Запись сообщения.
	 * @param Users_Model_User $oUser  Объект пользователя - получателя письма.
	 * @param integer $iIfSendFlag  Флаг, выставляемый в случае отсылки письма.
	 * @param integer $iNotSendFlag  Флаг, выставляемый в случае пропуска письма.
	 */
	protected function _sendMessage($aRecord,$oUser,$iIfSendFlag,$iNotSendFlag) {
		$bSend = $oUser->getMessageByEMail();

		if ($bSend) {
			try {
				$sFrom = 0 < ($iFromId = intval($aRecord['created_by']))
					? Users_Model_User::getById($iFromId)->getByLogin()
					: '~system~';
			}
			catch (Exception $oException) {
				$sFrom = '~unknown~';
			}

			$oMailHelper = new Users_Helper_Mail();
			$oMailHelper->direct($oUser->getEMail(),'on_send_message',array(
				'subject' => $aRecord['subject'],
				'from' => $sFrom,
				// TODO Сделать нормальное формирование ссылки.
				'url' => 'http://www.zend.my/users/profile?id='.$aRecord['target'],
			));
		}

		$oFlagTable = new Users_Table_Message_Flag();
		$oFlagTable->insert(array(
			'message_id' => $aRecord['id'],
			'user_id' => $oUser->getId(),
			'flag' => $bSend ? $iIfSendFlag : $iNotSendFlag,
		));
	}
}
?>